이 게시물을 개선하고 싶으십니까? 인용 및 답변이 올바른 이유에 대한 설명을 포함하여이 질문에 대한 자세한 답변을 제공하십시오. 상세 정보가 충분하지 않은 답변은 수정 또는 삭제 될 수 있습니다. 다음 명령을 사용하여 실수로 Git에 파일을 추가했습니다. git add myfile.txt 아직 git commit을 실행하지 않았습니다. 이것을 실행 취소하는 방법이 있습니까? 그래서 이러한 파일은 커밋에 포함되지 않습니까?
1 2 다음 커밋 전에 git add를 취소 할 수 있습니다. git reset <파일> 다른 어떤 것도 변경하지 않고 현재 인덱스 ( "약 커밋 예정"목록)에서 제거합니다. 당신이 사용할 수있는 자식 재설정 파일 이름없이 모든 예정된 변경 사항을 해제합니다. 이것은 적당한 시간에 하나씩 나열하기에는 너무 많은 파일이있을 때 유용 할 수 있습니다. 이전 버전의 Git에서 위의 명령은 각각 git reset HEAD및 git reset HEAD와 동일하며 HEAD가 정의되지 않은 경우 (저장소에서 아직 커밋을 수행하지 않았기 때문에) 또는 모호한 경우 ( HEAD라는 브랜치를 만들었는데, 이것은 당신이하지 말아야 할 어리석은 일입니다). 하지만 Git 1.8.2에서 변경되었으므로 최신 버전의 Git에서는 첫 번째 커밋을 만들기 전에도 위의 명령을 사용할 수 있습니다. "git reset"(옵션이나 매개 변수없이) 당신은 당신의 역사에 어떤 커밋도 없지만 이제 당신에게 빈 인덱스 (존재하지 않는 커밋과 일치시키기 위해). 문서 : git reset | 원하는 : git rm --cached 추리: 처음 접했을 때 처음으로 git reset. (내 전체 초기 추가를 취소하려면)이 (그렇지 않은) 유용한 메시지를 얻으려면 : 치명적 : 'HEAD'를 유효한 참조로 확인하지 못했습니다. 이것은 첫 번째 커밋 이후까지 HEAD ref (branch?)가 존재하지 않기 때문입니다. 즉, 저와 같은 워크 플로가 다음과 같은 경우 저와 같은 초보자 문제에 직면하게됩니다. 내 멋진 새 프로젝트 디렉토리로 이동하여 새로운 인기 Git을 사용해보세요. 자식 초기화 git add. 자식 상태 ... 많은 쓰레기 스크롤 ... => 젠장, 그 모든 것을 추가하고 싶지 않았습니다. 구글 "git add 실행 취소" => 스택 오버플로 찾기-예 git reset. => 치명적 : 'HEAD'를 유효한 참조로 확인하지 못했습니다. 또한 메일 링리스트에서 이것의 도움이되지 않는 것에 대해 기록 된 버그가 있음이 밝혀졌습니다. 그리고 올바른 해결책이 바로 Git 상태 출력에 있다는 것입니다 (예, 저는 '쓰레기'로 글을 썼습니다). ... # 커밋 할 변경 사항 : # ( "git rm --cached ..."을 사용하여 언 스테이지) ... 그리고 실제로 해결책은 git rm --cached FILE을 사용하는 것입니다. 여기 다른 곳에서 경고를 참고하십시오-git rm은 파일의 로컬 작업 복사본을 삭제하지만 --cached를 사용하는 경우에는 삭제하지 않습니다. 다음은 git help rm의 결과입니다. -캐시 인덱스에서만 경로를 스테이징 해제하고 제거하려면이 옵션을 사용하십시오. 수정 여부에 관계없이 작업 트리 파일은 그대로 유지됩니다. 나는 계속 사용한다 git rm --cached. 모든 것을 제거하고 다시 시작합니다. 그래도 작동하지 않았습니다. 재귀 적이며 rm은 재귀를 위해 -r이 필요합니다. 한숨. git rm -r --cached. 좋아요, 이제 시작했던 곳으로 돌아 왔습니다. 다음 번에는 -n을 사용하여 드라 이런을 수행하고 무엇이 추가되는지 확인하겠습니다. git add -n. 나는 아무것도 파괴하지 않는 --cached에 대해 git help rm을 신뢰하기 전에 모든 것을 안전한 장소에 압축했습니다 (그리고 철자가 틀리면 어떻게 될까요). | 입력하는 경우 : 자식 상태 Git은 스테이징 해제 방법에 대한 지침을 포함하여 스테이징 된 항목 등을 알려줍니다. "git reset HEAD <파일> ..."을 사용하여 언 스테이지 나는 Git이 이와 같은 상황에서 옳은 일을하도록 나를 찌르는 데 꽤 좋은 일을한다는 것을 알았다. 참고 : 최근 Git 버전 (1.8.4.x)에서이 메시지가 변경되었습니다. ( "git rm --cached <파일> ..."을 사용하여 언 스테이징) | 명확히하기 위해 : git add는 현재 작업 디렉토리에서 스테이징 영역 (색인)으로 변경 사항을 이동합니다. 이 프로세스를 스테이징이라고합니다. 따라서 변경 사항 (변경된 파일)을 준비하는 가장 자연스러운 명령은 분명한 것입니다. 자식 단계 git add는 git stage에 대해 입력하기 쉬운 별칭입니다. 안타깝게도 git unstage 또는 git unadd 명령이 없습니다. 관련된 것은 추측하거나 기억하기가 더 어렵지만 매우 분명합니다. git reset HEAD- 이에 대한 별칭을 쉽게 만들 수 있습니다. git config --global alias.unadd 'reset HEAD-' git config --global alias.unstage 'reset HEAD-' 마지막으로 새로운 명령이 있습니다. 자식 추가 file1 git 스테이지 file2 자식 unadd file2 git unstage file1 개인적으로 더 짧은 별칭을 사용합니다. git a # 스테이징 용 git u # 언 스테이징 용 | 허용되는 답변 외에도 실수로 추가 한 파일이 큰 경우 'git reset'으로 색인에서 제거 한 후에도 여전히 .git 디렉토리의 공간을 차지하는 것처럼 보입니다. 이것은 걱정할 것이 없습니다. 파일은 실제로 저장소에 있지만 "느슨한 개체"로만 존재합니다. 복제, 푸시를 통해 다른 리포지토리로 복사되지 않으며 공간은 곧 회수 될 것입니다. 불안하다면 다음을 실행할 수 있습니다. git gc --prune = now 업데이트 (다음은 가장 많이 찬성 된 답변에서 발생할 수있는 혼란을 해결하려는 나의 시도입니다) : 그렇다면 git add의 실제 실행 취소는 무엇입니까? git reset HEAD <파일>? 또는 git rm --cached <파일>? 엄밀히 말하면, 내가 착각하지 않았다면 : 없음. 일반적으로 git add는 취소 할 수 없습니다. 먼저 git add 이 실제로하는 일을 기억해 봅시다. 이 이전에 추적되지 않은 경우 git add가 다음 위치에 추가합니다.현재 콘텐츠와 함께 캐시. 이 이미 추적 된 경우 git add는 현재 콘텐츠 (스냅 샷, 버전)를 캐시에 저장합니다. Git에서는 파일의 두 가지 다른 버전 (스냅 샷)이 두 개의 다른 항목으로 간주되기 때문에이 작업은 여전히 추가 (단순한 업데이트가 아님)라고합니다. 따라서 실제로 캐시에 새 항목을 추가하고 있습니다. 나중에 커밋되었습니다. 이것에 비추어 볼 때 질문은 약간 모호합니다. 명령을 사용하여 실수로 파일을 추가했습니다 ... OP의 시나리오는 첫 번째 시나리오 (추적되지 않은 파일) 인 것 같습니다. "실행 취소"를 통해 추적 된 항목에서 파일 (현재 콘텐츠뿐만 아니라)을 제거하려고합니다. 이 경우 git rm --cached 을 실행해도됩니다. 그리고 git reset HEAD 을 실행할 수도 있습니다. 이것은 일반적으로 두 시나리오 모두에서 작동하기 때문에 바람직합니다. 이미 추적 된 항목의 버전을 잘못 추가 한 경우 실행 취소도 수행합니다. 그러나 두 가지주의 사항이 있습니다. 첫째 : (답변에서 지적했듯이) git reset HEAD가 작동하지 않는 시나리오가 하나 뿐이지 만 git rm --cached는 새로운 저장소 (커밋 없음)를 수행합니다. 그러나 실제로 이것은 실질적으로 관련이없는 경우입니다. 둘째 : git reset HEAD는 이전에 캐시 된 파일 내용을 마술처럼 복구 할 수 없으며 HEAD에서 다시 동기화 할뿐입니다. 잘못 안내 된 git add가 이전 단계의 커밋되지 않은 버전을 덮어 쓴 경우 복구 할 수 없습니다. 그렇기 때문에 엄밀히 말하면 [*]를 실행 취소 할 수 없습니다. 예: $ git init $ echo "버전 1"> file.txt $ git add file.txt # 첫 번째 file.txt 추가 $ git commit -m '첫 번째 커밋' $ echo "버전 2"> file.txt $ git add file.txt # file.txt의 "버전 2"단계 (커밋하지 마십시오) $ git diff --cached file.txt -버전 1 + 버전 2 $ echo "버전 3"> file.txt $ git diff file.txt -버전 2 + 버전 3 $ git add file.txt # 이런 뜻이 아닙니다 $ git reset HEAD file.txt # 실행 취소? $ git diff --cached file.txt # 물론 dif는 없습니다. 무대 == HEAD $ git diff file.txt # "버전 2"를 잃어 버렸습니다. -버전 1 + 버전 3 물론 새 파일을 추가하는 데만 'git add'를 수행하는 일반적인 게으른 워크 플로 (케이스 1)를 따르고 commit, git commit -a 명령을 통해 새 내용을 업데이트하는 경우에는 그다지 중요하지 않습니다. * (편집 : 위의 내용은 실제로 정확하지만 준비되었지만 커밋되지 않은 변경 사항을 복구하는 약간 엉성하고 복잡한 방법이있을 수 있습니다. Johannes Matokic 및 iolsmit의 의견 참조) | 이미 추가 된 파일을 실행 취소하는 것은 Git을 사용하여 매우 쉽습니다. 이미 추가 된 myfile.txt를 재설정하려면 다음을 사용하십시오. git reset HEAD myfile.txt 설명: 원하지 않는 파일을 준비한 후 실행 취소하려면 git reset을 수행 할 수 있습니다. Head는 로컬에서 파일의 헤드이고 마지막 매개 변수는 파일 이름입니다. 이러한 경우에 발생할 수있는 모든 단계를 포함하여 아래 이미지의 단계를 더 자세히 만들었습니다. | git rm --cached. -아르 자형 현재 디렉토리에서 추가 한 모든 것을 재귀 적으로 "추가 해제"합니다. | 운영 git gui 수동으로 또는 모든 파일을 선택하고 커밋에서 스테이지 해제 버튼을 클릭하여 모든 파일을 제거합니다. | 질문은 명확하게 제시되지 않았습니다. 그 이유는 git add에는 두 가지 의미가 있기 때문입니다. 스테이징 영역에 새 파일을 추가 한 다음 git rm --cached 파일로 실행 취소합니다. 수정 된 파일을 준비 영역에 추가 한 다음 git reset HEAD 파일로 실행 취소합니다. 의심스러운 경우 git reset HEAD 파일 두 경우 모두 예상되는 일을하기 때문입니다. 경고 : 수정 된 파일 (저장소에 이전에 존재했던 파일)에서 git rm --cached 파일을 수행하면 파일이 git 커밋에서 제거됩니다! 파일 시스템에는 여전히 존재하지만 다른 사람이 커밋을 가져 오면 해당 파일은 작업 트리에서 삭제됩니다. git status는 파일이 새 파일인지 수정되었는지 알려줍니다. 브랜치 마스터 커밋 할 변경 사항 : ( "git reset HEAD ..."을 사용하여 언 스테이지) 새 파일 : my_new_file.txt 수정 됨 : my_modified_file.txt | Git에는 상상할 수있는 모든 작업에 대한 명령이 있지만 제대로 작동하려면 광범위한 지식이 필요하기 때문에 기껏해야 반 직관적입니다. 이전에 수행 한 작업 : 파일을 변경하고 git add. 또는 git add 을 사용했습니다. 원하는 것 : 인덱스에서 파일을 제거하되 버전을 유지하고 작업 복사본에 커밋되지 않은 변경 사항을 남겨 둡니다. git reset HEAD <파일> 파일을 HEAD에서 마지막 상태로 재설정하고 변경 사항을 취소하고 색인에서 제거합니다. #`svn revert `IIRC를 생각해보십시오. git reset HEAD <파일> git checkout <파일> #` `과 같은 이름의` `가있는 경우 다음을 사용하십시오. git checkout-<파일> 이것은 git reset --hard HEAD가 단일 파일에서 작동하지 않기 때문에 필요합니다. 색인 및 버전 관리에서 을 제거하여 작업 복사본의 변경 사항과 함께 버전이 지정되지 않은 파일을 유지합니다. git rm --cached <파일> 작업 복사본 및 버전 관리에서 <파일>을 완전히 제거하십시오. git rm <파일> | 초기 커밋 중이고 git을 사용할 수없는 경우재설정, "Git 파산"을 선언하고 .git 폴더를 삭제하고 다시 시작하십시오. | 다른 많은 답변에 따라 git reset을 사용할 수 있습니다. 그러나: git unadd에 대한 Git 명령 (음, 별칭)을 실제로 추가하는이 멋진 게시물을 찾았습니다. 자세한 내용은 git unadd를 참조하세요. 간단히, git config --global alias.unadd "reset HEAD" 이제 할 수 있습니다 git unadd foo.txt bar.txt | git add -i를 사용하여 다가오는 커밋에서 방금 추가 한 파일을 제거합니다. 예: 원하지 않는 파일 추가 : $ git add foo $ 자식 상태 # 브랜치 마스터에서 # 커밋 할 변경 사항 : # ( "git reset HEAD ..."을 사용하여 unstage) # # 새 파일 : foo # # 추적되지 않는 파일 : # (커밋 될 내용에 포함하려면 "git add ..."사용) # [...] # 대화식 추가로 이동하여 추가를 실행 취소합니다 (여기에 git에 입력 된 명령은 "r"(되돌리기), "1"(목록의 첫 번째 항목이 되돌림 표시), 되돌리기 모드에서 빠져 나가기위한 'return'및 "q"입니다.) (떠나다): $ git add -i 단계적 무단계 경로 1 : + 1 / -0 아무것도 foo *** 명령 *** 1 : [s] tatus 2 : [u] pdate 3 : [r] evert 4 : [a] dd 추적되지 않음 5 : [p] atch 6 : [d] iff 7 : [q] uit 8 : [h] elp 지금 무엇> r 단계적 무단계 경로 1 : + 1 / -0 없음 [f] oo 되돌리기 >> 1 단계적 무단계 경로 * 1 : + 1 / -0 없음 [f] oo 되돌리기 >> 참고 : foo는 이제 추적되지 않습니다. 한 경로를 되돌 렸습니다. *** 명령 *** 1 : [s] tatus 2 : [u] pdate 3 : [r] evert 4 : [a] dd 추적되지 않음 5 : [p] atch 6 : [d] iff 7 : [q] uit 8 : [h] elp 지금 무엇> q 안녕. $ 그게 다야! 다음은 "foo"가 추적되지 않은 목록에 다시 있음을 보여주는 증거입니다. $ 자식 상태 # 브랜치 마스터에서 # 추적되지 않는 파일 : # (커밋 될 내용에 포함하려면 "git add ..."사용) # [...] # foo 커밋에 추가 된 것이 없지만 추적되지 않은 파일이 있습니다 (추적하려면 "git add"사용) $ | --cached 플래그와 함께 git remove 또는 git rm을 사용할 수 있습니다. 시험: git help rm | 새 프로젝트를 시작할 때이 성가신 문제를 피하는 방법은 다음과 같습니다. 새 프로젝트의 기본 디렉토리를 만듭니다. git init를 실행합니다. 이제 .gitignore 파일을 만듭니다 (비어 있어도). .gitignore 파일을 커밋합니다. Git은 커밋이 없으면 git reset을 수행하기가 정말 어렵습니다. 하나를 갖기 위해 작은 초기 커밋을 생성 한 후 git add -A 및 git reset을 원하는만큼 여러 번 수행하여 모든 것을 올바르게 할 수 있습니다. 이 방법의 또 다른 장점은 나중에 줄 끝 문제가 발생하여 모든 파일을 새로 고쳐야하는 경우 다음과 같이 간단하다는 것입니다. 초기 커밋을 확인하십시오. 그러면 모든 파일이 제거됩니다. 그런 다음 가장 최근 커밋을 다시 확인하십시오. 현재 줄 끝 설정을 사용하여 파일의 새 복사본을 검색합니다. | 질문을 게시 한 이후 Git이 발전했을 수 있습니다. $> git --version git 버전 1.6.2.1 이제 다음을 시도 할 수 있습니다. git reset HEAD. 이것은 당신이 찾고있는 것이어야합니다. | 개정판을 지정하지 않으면 구분 기호를 포함해야합니다. 내 콘솔의 예 : git reset 치명적 : 모호한 인수 ' ': 알 수없는 개정 또는 작업 트리에 경로가 없습니다. '-'를 사용하여 경로와 개정판을 구분하십시오. git reset- 재설정 후 단계 화되지 않은 변경 : M <파일 경로> (Git 버전 1.7.5.4) | 위에서 제안한대로 스테이징 영역에서 새 파일을 제거하려면 (새 파일의 경우에만) : git rm --cached 파일 실수로 추가 된 새 파일에만 rm --cached를 사용하십시오. | 특정 폴더 (및 하위 폴더)의 모든 파일을 재설정하려면 다음 명령을 사용할 수 있습니다. 자식 재설정 * | * 명령을 사용하여 한 번에 여러 파일을 처리합니다. git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * 기타 | git reset을 입력하면 되돌릴 것이고 git add를 입력하지 않은 것과 같습니다. 마지막 커밋 이후. 전에 약속했는지 확인하십시오. | 새 파일 newFile.txt를 만든다고 가정합니다. 실수로 파일을 추가했다고 가정하고 git add newFile.txt : 이제 커밋하기 전에이 추가를 실행 취소하고 싶습니다. git reset newFile.txt : | 특정 파일의 경우 : git reset my_file.txt git checkout my_file.txt 추가 된 모든 파일 : git reset. git checkout. 참고 : 체크 아웃은 파일의 코드를 변경하고 마지막으로 업데이트 된 (커밋 된) 상태로 이동합니다. 재설정은 코드를 변경하지 않습니다. 헤더 만 재설정합니다. | git add를 실행 취소하려면 다음을 사용하십시오. 자식 재설정 파일 이름 | 이 명령은 변경 사항을 공개합니다. git reset HEAD filename.txt 당신은 또한 사용할 수 있습니다 자식 추가 -p 파일의 일부를 추가합니다. | 대화 형 모드도 있습니다. 자식 추가 -i 파일 추가를 취소하려면 옵션 3을 선택하십시오. 제 경우에는 종종 하나 이상의 파일을 추가하고 싶고 대화 형 모드에서는 이와 같은 숫자를 사용하여 파일을 추가 할 수 있습니다. 4 : 1, 2, 3 및 5를 제외한 모든 항목이 필요합니다. 시퀀스를 선택하려면 1-5를 입력하여 1에서 5까지 모두 가져옵니다. Git 스테이징 파일 | git add myfile.txt # 커밋 할 목록에 파일을 추가합니다. 이 명령의 정반대는 git reset HEAD myfile.txt # 실행 취소됩니다.그것. 따라서 이전 상태가됩니다. 지정된 항목은 다시 추적되지 않은 목록 (이전 상태)이됩니다. 지정된 파일로 머리를 재설정합니다. 따라서 머리에 의미가 없으면 간단히 재설정됩니다. | git reset filename.txt 다른 항목을 변경하지 않고 현재 색인, "약 커밋 예정"영역에서 filename.txt라는 파일을 제거합니다. | git reset filename.txt 다른 항목을 변경하지 않고 현재 색인, "약 커밋 예정"영역에서 filename.txt라는 파일을 제거합니다. | Sourcetree에서는 GUI를 통해이 작업을 쉽게 수행 할 수 있습니다. Sourcetree가 파일을 언 스테이징하는 데 사용하는 명령을 확인할 수 있습니다. 새 파일을 만들어 Git에 추가했습니다. 그런 다음 Sourcetree GUI를 사용하여 언 스테이징했습니다. 결과는 다음과 같습니다. 파일 준비 해제 [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-path / to / file / filename.java Sourcetree는 reset을 사용하여 새 파일을 언 스테이징합니다. | 1 2 다음 매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다. 찾고있는 답변이 아닙니까? git version-control git-commit git-stage 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.